#ifndef E_ITEM_VISITOR_H
#define E_ITEM_VISITOR_H

#include <DefineLibCommon.h>
#include <DefineCommon.h>
#include <EItem.h>

#include <EItemMetaProperty.h>
#include <memory>
#include <stack>
#include <deque>

/**Visitor for EItem, can travel all child EItem
 * */
class EItemVisitor;
typedef SmartPtr(EItemVisitor) EItemVisitorPtr;
class COMMON_DLL EItemVisitor 
{
public:
    EItemVisitor();
    virtual ~EItemVisitor();

    virtual void travelEItem(EItemPtr item, int depth = 0);

    //called by travelEItem, return true, then continue traveling, return false, then stop traveling
    virtual bool handleEItem(EItemPtr item, int depth, EItemPtr parentItem);

    void setName(const EString& name);
    EString getName();
protected:
    // std::stack<EItemPtr> m_stackItem;
    std::deque<EItemPtr> m_stackItem;
    EString m_name;

};

#endif // EITEM_VISITOR_H
